# 关键字
# 关键字是Python语言中具有特殊意义的单词, 不能用作变量名、函数名、类名等标识符。

# 打印关键字列表
# import keyword
# print(keyword.kwlist)
# 关键字详解：[https://www.cainiaojc.com/python/python-keyword-list.html]

# 布尔值 True 和 False
# print(True==1) # True
# print(False==0) # True
# print(True==0) # False
# print(False==1) # False
# print(True==False) # False
# print(True!=False) # True
# print(True!=True) # False


# 空值None
# print(None==None) # True
# print(None==0) # False
# print(None==False) # False
# print(None==True) # False
# print(None==[]) # False
# print(None=='') # False


# 程序流未遇到return语句时，默认返回None; 即使函数中有return语句，如果在条件下无返回，也会返回None
def test():
    cont = 1
    pass
# print(test()) # None

# 逻辑运算符 and, or, not
# print(True and False) # False
# print(True or False) # True
# print(not True) # False
# print(not False) # True

# as 关键字, 用于给模块或变量起别名; import 关键字, 用于导入模块或变量
import math as mymath # 给math模块起别名mymath
# print(mymath.pi) # 3.141592653589793

# assert 断言, 用于调试程序, 断言失败时会抛出AssertionError异常；
# assert 1==1 # 断言成功，程序继续执行
# print("断言成功")
# assert 1==2, '1 不等于 2' # 断言失败，程序终止执行，抛出AssertionError异常
# print("断言失败") # 不会执行到这里


# async, await 关键字, 用于异步编程
# import asyncio # 导入asyncio模块
# async def test(): # 定义一个异步函数
#     print("Hello, World!") # 打印Hello, World!
#     await asyncio.sleep(3) # 等待1秒
#     print("Hello, World!") # 打印Hello, World!
#     await asyncio.sleep(1) # 等待1秒
# asyncio.run(test()) # 运行异步函数


# for, while 关键字, 用于循环
# for i in range(1,11): # 循环10次 range(10) 等价于 range(0,10)
#     print(i) # 打印i : 1,2,3,4,5,6,7,8,9,10
# i = 1 # 定义一个变量i, 初始值为1
# while i <= 10: # 当i小于等于10时, 执行以下代码
#     print(i) # 打印i : 1,2,3,4,5,6,7,8,9,10
#     i += 1 # i自增1
# else: # 当循环结束时, 执行以下代码
#     print("循环结束") # 打印循环结束


# break, continue, pass 关键字, 用于控制程序流程
# for i in range(1,11): # 循环10次 range(10) 等价于 range(0,10)
#     if i == 5: # 如果i等于5   
#         break # 跳出循环      
#     print(i) # 打印i : 1,2,3,4

# for i in range(1,11): # 循环10次 range(10) 等价于 range(0,10)
#     if i == 5: # 如果i等于5
#         continue # 跳过本次循环
#     print(i) # 打印i : 1,2,3,4,6,7,8,9,10

# for i in range(1,11): # 循环10次 range(10) 等价于 range(0,10)
#     if i == 5: # 如果i等于5
#         pass # 什么都不做, 跳过本次循环
#     print(i) # 打印i : 1,2,3,4,5,6,7,8,9,10


# class 关键字, 用于定义类; def 关键字, 用于定义函数
# class Person: # 定义一个Person类
#     def __init__(self, name, age): # 定义一个构造函数, 用于初始化对象的属性
#         self.name = name # 定义一个name属性, 用于存储姓名
#         self.age = age # 定义一个age属性, 用于存储年龄
#     def say_hello(self): # 定义一个say_hello方法, 用于打印Hello, World!
#         print("Hello, World!") # 打印Hello, World!
#     def say_name(self): # 定义一个say_name方法, 用于打印姓名
#         print("My name is " + self.name) # 打印姓名
# print(Person.say_hello)


# del 关键字, 用于删除对象, 变量, 模块, 函数, 类等
# del Person # 删除Person类
# print(Person) # 抛出NameError异常, Person类不存在
# print(Person.say_hello) # 抛出NameError异常, Person类不存在

# a = ['1', '2', '3'] # 定义一个列表
# del a[1] # 删除列表中的第2个元素, 即'2'
# print(a) # 打印列表, 输出: ['1', '3'


# except, raise, try, finally 关键字, 用于异常处理
# def tryText(num):
#     try: # 尝试执行以下代码
#         r = 1/num # 计算1除以num的值
#     except ZeroDivisionError: # 捕获ZeroDivisionError异常
#         print("除数不能为0") # 打印除数不能为0
#         return
#     # finally: # 无论是否捕获到异常, 都会执行以下代码
#     #     print("程序结束") # 打印程序结束
#     return r # 返回r的值
# print(tryText(10))
# print(tryText(0))


# form, import 关键字, 用于导入模块, 类, 函数, 变量等
# import math # 导入math模块, 可以使用math模块中的函数, 如math.pi, math.sin, math.cos等
# print(math.pi) # 打印math模块中的pi常量, 输出: 3.141592653589793
# print(math.sin(0)) # 打印math模块中的sin函数, 输出: 0.0
# print(math.cos(0)) # 打印math模块中的cos函数, 输出: 1.0

# form 分类型导入, 可以导入模块中的特定函数, 类, 变量等
# from math import pi, sin, cos # 从math模块中导入pi, sin, cos函数, 可以直接使用pi, sin, cos函数, 无需使用math.前缀
# print(pi) # 打印pi常量, 输出: 3.141592653589793
# print(sin(0)) # 打印sin函数, 输出: 0.0
# print(cos(0)) # 打印cos函数, 输出: 1.0


# global 关键字, 用于声明全局变量; 
# 如果我们需要读取全局变量的值，则不必将其定义为global。这是需要的地方。
# 如果需要在函数内部修改全局变量的值，则必须使用进行声明global。否则，将创建一个具有该名称的局部变量
# a = 1 # 定义一个全局变量a, 初始值为1
# def test(): # 定义一个函数test
#     global a # 声明a为全局变量
#     a = 2 # 修改a的值为2
#     print(a) # 打印a的值, 输出: 2
# test() # 调用test函数
# print(a) # 打印a的值, 输出: 2

# nonlocal 关键字, 用于声明非局部变量; 用于在函数内部修改外部函数的局部变量
# def test(): # 定义一个函数test
#     a = 1 # 定义一个局部变量a, 初始值为1
#     def test2(): # 定义一个函数test2
#         nonlocal a # 声明a为非局部变量
#         a = 2 # 修改a的值为2
#         print(a) # 打印a的值, 输出: 2
#     test2() # 调用test2函数
#     print(a) # 打印a的值, 输出: 2
# test() # 调用test函数
# # print(a) # 抛出NameError异常, a变量不存在
# global a # 声明a为全局变量
# a = 3 # 修改a的值为3
# print(a) # 打印a的值, 输出: 3


# in, is, not, not in 关键字, 用于判断一个元素是否在一个集合中, 或者判断两个对象是否相同
# a = [1, 2, 3] # 定义一个列表
# if 1 in a: # 如果1在列表a中
#     print("1在列表a中") # 打印1在列表a中
# else: # 如果1不在列表a中
#     print("1不在列表a中") # 打印1不在列表a中
# if 1 is a: # 如果1是列表a
#     print("1是列表a") # 打印1是列表a
# else: # 如果1不是列表a
#     print("1不是列表a") # 打印1不是列表a
# if 1 is not a: # 如果1不是列表a
#     print("1不是列表a") # 打印1不是列表a
# else: # 如果1是列表a
#     print("1是列表a") # 打印1是列表a


# with 关键字, 用于控制程序流程; yield 用于暂停函数, 并返回一个值, 下次调用时, 从上次暂停的位置继续执行
# def test(): # 定义一个函数test
#     with open("test.txt", "w") as f: # 打开文件test.txt, 以写入模式打开, 并将文件对象赋值给f  
#         f.write("Hello, World!") # 写入Hello, World!到文件中
#     yield # 暂停函数, 等待下一次调用
#     print("程序结束") # 打印程序结束

# # 函数中包含yield关键字, 则该函数是一个生成器函数, 可以使用for循环遍历生成器函数的返回值
# for i in test(): # 遍历test函数的返回值
#     print(i) # 打印i的值, 输出: None

# g = (2**x for x in range(10)) # 定义一个生成器表达式, 用于生成2的幂次方, 从0到9
# next(g) # 获取生成器表达式的下一个值, 输出: 1
# next(g) # 获取生成器表达式的下一个值, 输出: 2
# next(g) # 获取生成器表达式的下一个值, 输出: 4
# next(g) # 获取生成器表达式的下一个值, 输出: 8

# def test(): # 定义一个函数test
#     for i in range(10): # 循环10次
#         yield i * i # 暂停函数, 并返回i*i的值, 下次调用时, 从上次暂停的位置继续执行
# gl = test() # 调用test函数, 并将返回值赋值给g
# for i in gl: # 遍历g的返回值
#     print(i) # 打印i的值, 输出: 0, 1, 4, 9, 16, 25, 36, 49, 64, 81


# 变量的命名规则
# 变量名只能包含字母、数字和下划线，不能以数字开头，不能包含空格，不能使用关键字